// Scintilla source code edit control

// Copyright 2006 by Neil Hodgson <neilh@scintilla.org>
// The License.txt file describes the conditions under which this software may be distributed.

#include <stdlib.h>
#include <ctype.h>

#include "CharClassify.h"

#ifdef SCI_NAMESPACE
using namespace Scintilla;
#endif

CharClassify::CharClassify() {
  SetDefaultCharClasses( true );
}

void CharClassify::SetDefaultCharClasses( bool includeWordClass ) {
  // Initialize all char classes to default values
  for( int ch = 0; ch < 256; ch++ ) {
    if( ch == '\r' || ch == '\n' ) {
      charClass[ch] = ccNewLine;
    } else if( ch < 0x20 || ch == ' ' ) {
      charClass[ch] = ccSpace;
    } else if( includeWordClass && ( ch >= 0x80 || isalnum( ch ) || ch == '_' ) ) {
      charClass[ch] = ccWord;
    } else
    { charClass[ch] = ccPunctuation; }
  }
}

void CharClassify::SetCharClasses( const unsigned char *chars, cc newCharClass ) {
  // Apply the newCharClass to the specifed chars
  if( chars ) {
    while( *chars ) {
      charClass[*chars] = static_cast<unsigned char>( newCharClass );
      chars++;
    }
  }
}

int CharClassify::GetCharsOfClass( cc characterClass, unsigned char *buffer ) {
  // Get characters belonging to the given char class; return the number
  // of characters (if the buffer is NULL, don't write to it).
  int count = 0;
  for( int ch = maxChar - 1; ch >= 0; --ch ) {
    if( charClass[ch] == characterClass ) {
      ++count;
      if( buffer ) {
        *buffer = static_cast<unsigned char>( ch );
        buffer++;
      }
    }
  }
  return count;
}
